package com.dong.thread.threadbasic;

/**
 * 优雅的结束线程 - 使用volatile变量结束线程
 * 算是比较优雅的方式，但不能精确地控制循环了多少次（所以不要依赖循环中间的某个具体状态，比如循环次数这种）
 * 1. 不适合某些场景（比如还没有同步的时候，线程做了阻塞操作(wait在那里了或其他)，没有办法循环回去）
 * 2. 打断时间也不是特别精确，比如一个阻塞容器，容量为5的时候结束生产者;
 *      但是，由于volatile同步线程标志位的时间控制不是很精确，有可能生产者还继续生产一段儿时间
 *
 * @author by jiweidong on 2021/11/23.
 */
public class T11_Thread_End_Volatile {

    private static volatile boolean running = true;

    public static void main(String[] args) {
        Thread t = new Thread(() -> {
            long i = 0L;
            while (running) {
                i++;
            }

            System.out.println("end and i = " + i);
            //第一次执行：3805073595
            //第一次执行：3667345247
            // 每次执行循环的次数都不一样
        });

        t.start();

        SleepHelper.sleepSeconds(1);

        running = false;
    }
}
